/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package diseño09.controles;

import diseño09.ErrorAgregar;
import diseño09.entidades.EquipoFantasia;
import diseño09.entidades.Fecha;
import diseño09.entidades.Historial;
import diseño09.entidades.Jugador;
import diseño09.entidades.Participante;

/**
 *
 * @author aguwolky
 */
public class GestorDeEquipoDeFantasia {

    public static void main(String args[]) {

    }

    public EquipoFantasia obtenerEquipoEnFecha(String unNombreEquipo, Fecha fechaQueJugo){
        GestorDeBaseDeDatos gestor=new GestorDeBaseDeDatos();

        EquipoFantasia equipoFantasia = gestor.instanciarEquipoFantasia(unNombreEquipo);

        Historial[] historiales=gestor.obtenerHistorialesVigentes(equipoFantasia);

        for(int i=0; i<15; i++){
            Jugador jugador=gestor.instanciarJugador(historiales[i].getIdJugador());
            equipoFantasia.setJugador(jugador);
        }

        return equipoFantasia;
    }

    public int guardarEquipo(EquipoFantasia unEquipoFantasia,Participante unParticipante){

        VerificadorDeEquipos v=new VerificadorDeEquipos();

        int verificacion=v.validarGuardarEquipo(unEquipoFantasia);
        if(verificacion==0){
            auditarCreacion(unEquipoFantasia);

            GestorDePartidosFechasYClubes gestor2=new GestorDePartidosFechasYClubes();
            Fecha fechaActual=gestor2.obtenerFechaActual();
            unEquipoFantasia.setFechaVigencia(fechaActual);

            GestorDeBaseDeDatos gbd=new GestorDeBaseDeDatos();
            unEquipoFantasia.setID(gbd.obtenerNuevoIdEquipoFantasia());
            gbd.persistirEquipoFantasia(unEquipoFantasia,unParticipante);

            crearHistoriales(unEquipoFantasia);
        }

        return verificacion;
    }

    public void actualizarPresupuesto(int unPresupuesto, EquipoFantasia unEquipoFantasia){
        
    }

    public void quitarJugador(Jugador unJugador, EquipoFantasia unEquipoFantasia){

        unEquipoFantasia.quitarJugador(unJugador);

    }

    public void sustituirJugador(Jugador unTitular, EquipoFantasia unEquipoFantasia){
        unEquipoFantasia.sustituir(unTitular);
    }

    public int consultarPresupuesto(EquipoFantasia unEquipoFantasia){
        return 0;

        //HACERRRRRRRRR!!!!!!!!!
    }

    public boolean agregarJugador(Jugador unJugador, EquipoFantasia unEquipoFantasia){
        VerificadorDeEquipos verif=new VerificadorDeEquipos();

        int tipoError=verif.validarAgregarJugador(unJugador, unEquipoFantasia);
        
        if(tipoError!=0){
            ErrorAgregar error=new ErrorAgregar(tipoError);
            error.setDefaultCloseOperation(2);
            error.setVisible(true);
            return false;
        }
        else
            unEquipoFantasia.setJugador(unJugador);
            return true;
        
    }

    public void auditarCreacion(EquipoFantasia unEquipoFantasia){
        unEquipoFantasia.setFechaCreacion();
        unEquipoFantasia.setHoraCreacion();
    }

    public void crearHistoriales(EquipoFantasia unEquipoFantasia){
        Jugador[] listaJugadores= unEquipoFantasia.getJugadores();
        Fecha fechaActual= unEquipoFantasia.getFechaVigencia();
        Historial[] listaHistoriales=new Historial[15];
        Historial historial;
        for(int i=0; i<15; i++){
            historial= new Historial(listaJugadores[i].getID(),fechaActual,unEquipoFantasia.getID(),i);
            listaHistoriales[i]=historial;
        }
        GestorDeBaseDeDatos gdb= new GestorDeBaseDeDatos();
        gdb.persistirHistoriales(listaHistoriales);
    }

    public Jugador[] obtenerJugadores(EquipoFantasia unEquipoFantasia){
        return unEquipoFantasia.getJugadores();
    }

    public void actualizarHistoriales(Historial[] unArrayHistoriales,
            Jugador unViejoTitular){
        int i=0;
        boolean flag=false;
        while(!flag){
            if(unArrayHistoriales[i].getIdJugador()==unViejoTitular.getID())
                flag=true;
            i++;
        }
        i--;
        Historial aux;
        switch(i){
            case 0: unArrayHistoriales[11].setPosicion(i);
                    unArrayHistoriales[i].setPosicion(11);
                    aux=unArrayHistoriales[11];
                    unArrayHistoriales[11]=unArrayHistoriales[i];
                    unArrayHistoriales[i]=aux;
                    break;
            case 1:
            case 2:
            case 3:
            case 4: unArrayHistoriales[12].setPosicion(i);
                    unArrayHistoriales[i].setPosicion(12);
                    aux=unArrayHistoriales[12];
                    unArrayHistoriales[12]=unArrayHistoriales[i];
                    unArrayHistoriales[i]=aux;
                    break;
            case 5:
            case 6:
            case 7: unArrayHistoriales[13].setPosicion(i);
                    unArrayHistoriales[i].setPosicion(13);
                    aux=unArrayHistoriales[13];
                    unArrayHistoriales[13]=unArrayHistoriales[i];
                    unArrayHistoriales[i]=aux;
                    break;
            case 8:
            case 9:
            case 10: unArrayHistoriales[14].setPosicion(i);
                     unArrayHistoriales[i].setPosicion(14);
                     aux=unArrayHistoriales[14];
                     unArrayHistoriales[14]=unArrayHistoriales[i];
                     unArrayHistoriales[i]=aux;
                     break;

        }
    }

    public void filtrarHistorialesModificados(Historial[] unArrayHistorialesViejos,
        Historial[] unArrayHistorialesNuevos, Fecha unaFecha){

            for(int i=0; i<15; i++){
                if(unArrayHistorialesViejos[i].getIdJugador()==unArrayHistorialesNuevos[i].getIdJugador()){
                    unArrayHistorialesViejos[i]=null;
                    unArrayHistorialesNuevos[i]=null;
                }
                else
                    if(unArrayHistorialesViejos[i].getFechaInicio().getID()!=unaFecha.getID()){
                        unArrayHistorialesViejos[i].setFechaFin(unaFecha);
                        unArrayHistorialesNuevos[i].setFechaInicio(unaFecha);
                    }
                    else{
                        unArrayHistorialesViejos[i]=unArrayHistorialesNuevos[i];
                        unArrayHistorialesNuevos[i]=null;
                    }

            }
        GestorDeBaseDeDatos gestor=new GestorDeBaseDeDatos();

        gestor.actualizarHistoriales(unArrayHistorialesViejos);
        gestor.persistirHistorialesNuevos(unArrayHistorialesNuevos);

    }

    public void reiniciarTransferencias(EquipoFantasia unEquipoFantasia){
        unEquipoFantasia.setTransferenciaRestante(3);
    }

    public Jugador obtenerJugador(EquipoFantasia unEquipoFantasia, int posicion) {
        return unEquipoFantasia.getJugador(posicion);
    }

    public void actualizarEquipoModificado(EquipoFantasia equipoActual) {
        GestorDeBaseDeDatos gestor=new GestorDeBaseDeDatos();
        gestor.actualizarEquipoModificado(equipoActual);
    }

    public void actualizarPuntajeTotal(EquipoFantasia unEquipo, int unPuntaje) {
        unEquipo.actualizarPuntajeTotal(unPuntaje);
    }

    public void setearCalificaciones(EquipoFantasia equipoFantasia, Fecha unaFecha) {
        Jugador[] jugadores=equipoFantasia.getJugadores();
        GestorDeCalificaciones gdc= new GestorDeCalificaciones();
        GestorDeBaseDeDatos gestor=new GestorDeBaseDeDatos();
        for(int i=0; i<jugadores.length; i++){
            jugadores[i].setCalificacion(gestor.obtenerCalificacion(jugadores[i].getID(),unaFecha.getID()),
                                        unaFecha.getNumeroFecha());

            gdc.calcularPuntajeTotalJugador(i, jugadores[i].getCalificacionEnFecha(unaFecha.getNumeroFecha()));
            gestor.actualizarPuntajeTotalJugador(jugadores[i].getCalificacionEnFecha(unaFecha.getNumeroFecha()));
        }
    }

}
